/*/////////////////////////////////////////////////////////////////////////////////
/// An
///    ___   ____ ___ _____ ___  ____
///   / _ \ / ___|_ _|_   _/ _ \|  _ \
///  | | | | |  _ | |  | || | | | |_) |
///  | |_| | |_| || |  | || |_| |  _ <
///   \___/ \____|___| |_| \___/|_| \_\
///                              File
///
/// Copyright (c) 2008-2009 Ismail TARIM <ismail@royalspor.com> and the Ogitor Team
//
//This program is free software; you can redistribute it and/or modify it under
//the terms of the GNU Lesser General Public License as published by the Free Software
//Foundation; either version 2 of the License, or (at your option) any later
//version.
//
//This program is distributed in the hope that it will be useful, but WITHOUT
//ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
//FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public License along with
//this program; if not, write to the Free Software Foundation, Inc., 59 Temple
//Place - Suite 330, Boston, MA 02111-1307, USA, or go to
//http://www.gnu.org/copyleft/lesser.txt.
////////////////////////////////////////////////////////////////////////////////*/

#pragma once

#include "OgitorsSingleton.h"


namespace Ogitors
{
    // BINDINGS is used to define BINDINGS between PropertyGrid and Functions of
    // Editor Classes, String value is converted to a Function ID using this list
    typedef HashMap<std::string, unsigned int> BindingMap;

    class OGUIWidget;
    //! Ogitor System class
    /*!  
        A class that is responsible for handling UI dialogs, maintenance of tree view widget and extra utility functions
    */
    class OgitorExport OgitorsSystem: public Singleton<OgitorsSystem>
    {
    public:
        /**
        * Constructor
        */
        OgitorsSystem();
        /**
        * Destructor
        */
        virtual ~OgitorsSystem();
        /**
        * Fetches binding value from a string
        * @param arg string binding value to be converted
        * @return binding value 
        * @see PROPERTYBINDING
        */
        unsigned int GetBindingValue(std::string arg);
        /**
        * Populates binding list with values
        */
        void         InitBindings();
        /**
        * Fetches full path to specified directory
        * @param dirname directory name
        * @return full path to specified directory
        * @todo Recommend renaming to GetFullPath
        */
        Ogre::String QualifyPath(const Ogre::String &dirname);
        /**
        * Fetches relative path from one directory to another
        * @param pathFrom originating path
        * @param pathTo destination path
        * @return relative path from origin to destination directories
        */
        Ogre::String GetRelativePath(const Ogre::String pathFrom,const Ogre::String pathTo);
        /**
        * Parses a string of strings into the list
        * @param str string containing multiple entries 
        * @param list a list to put strings into
        */
        void         ParseStringVector(Ogre::String &str, Ogre::StringVector &list);
        /**
        * Parses a string of strings into the list (UTF based)
        * @param str string containing multiple entries 
        * @param list a list to put strings into
        */
        void         ParseUTFStringVector(Ogre::UTFString &str, UTFStringVector &list);
        /**
        * Cleans a path of un-needed characters/symbols
        * @param path to be cleaned
        */
        void         CleanPath(Ogre::String &path);
        /**
        * Extracts file name from given path
        * @param path path containing the filename
        * @return file name
        * @todo Recommend renaming to GetFileName
        */
        Ogre::String ExtractFileName(const Ogre::String &path);
        /**
        * Extracts file path from given path
        * @param path path containing the the file path
        * @return file path
        * @todo Recommend renaming to GetFilePath
        */
        Ogre::String ExtractFilePath(const Ogre::String &path);
        /**
        * Copies files from one directory into another
        * @param source source directory to copy files from
        * @param destination destination directory to copy files to
        * @return true 
        */
        virtual bool CopyFilesEx(Ogre::String source, Ogre::String destination) = 0;
        /**
        * Creates new directory at specified path
        * @param dirname path to make new directory at
        * @return true if directory was created successfully, otherwise false
        */
        virtual bool MakeDirectory(Ogre::String dirname) = 0;
        /**
        * Fetches full path to the Ogitor' executable
        * @return full path to the Ogitor' executable
        */
        virtual Ogre::String GetExePath() = 0;
        /**
        * Fetches full path to the Ogitor' Projects directory
        * @return full path to the Ogitor' Projects directory
        */
        virtual Ogre::String getProjectsDirectory() = 0;
        /**
        * Deletes specified file
        * @param file full path to the file, including file name
        */
        virtual void DeleteFile(const Ogre::String &file) = 0;
        /**
        * Changes file name
        * @param oldname original name of the file (full path)
        * @param newname new name of the file (full path)
        */
        virtual void RenameFile(const Ogre::String &oldname, const Ogre::String &newname) = 0;
        /**
        * Fetches a list of files in specified directory
        * @param path path which is to be enumerated with files
        * @param list a list to place file names into
        */
        virtual void GetFileList(Ogre::String path, Ogre::StringVector &list) = 0;
        /**
        * Displays "Open File" dialog
        * @param title title of the dialog
        * @param extensionlist the list of extensions to filter out
        * @return name of selected file
        */
        virtual Ogre::String DisplayOpenDialog(Ogre::UTFString title, UTFStringVector ExtensionList) = 0;
        /**
        * Displays "Save File" dialog
        * @param title title of the dialog
        * @param extensionlist the list of extensions to filter out
        * @return name of the file to be saved
        */
        virtual Ogre::String DisplaySaveDialog(Ogre::UTFString title, UTFStringVector ExtensionList) = 0;
        /**
        * Displays "Yes/No/Cancel" or "Okay/Cancel" dialog
        * @param msg message to convey to the user
        * @param dlgType type of the dialog
        * @return dialog result
        */
        virtual DIALOGRET    DisplayMessageDialog(Ogre::UTFString msg, DIALOGTYPE dlgType) = 0;
        /**
        * Displays terrain creation dialog
        * @param params additional terrain parameters needed for its creation
        * @return true if dialog' result was accepted, otherwise false
        */
        virtual bool         DisplayTerrainDialog(Ogre::NameValuePairList &params) = 0;
        /**
        * Displays heightmap import dialog
        * @param params additional heightmap parameters needed for its import
        * @return true if dialog' result was accepted, otherwise false
        */
        virtual bool         DisplayImportHeightMapDialog(Ogre::NameValuePairList &params) = 0;
        /**
        * Supplies feedback about loading progress 
        * @param percentage The completion percentage
        * @param msg info about the loading stage
        */
        virtual void         UpdateLoadProgress(float percentage, Ogre::UTFString msg) = 0;
        /**
        * Translates specified string into OGRE-based UTF string
        * @param str string to be translated
        * @return 
        */
        virtual Ogre::UTFString Translate(Ogre::String& str) {return str;};
        /**
        * Translates specified string into OGRE-based UTF string
        * @param str pointer to character array to be translated (wrapped)
        * @return 
        */
        virtual Ogre::UTFString Translate(const char * str) {return Ogre::String(str);};
        /**
        * Unloades property sheets
        * @todo Recommend renaming to UnloadPropertySheets
        */
        virtual void         UnLoadPropertySheets() = 0;
        /**
        * Loads specified property sheet
        * @param idx top level sheet container ID
        * @param filename of the sheet to be loaded 
        * @see EDITORTYPE
        */
        virtual void         LoadPropertySheet(int idx, Ogre::String filename) = 0;
        /**
        * Tests if the system has treeview widget associated with it
        * @return true if it has treeview widget associated with it, otherwise false
        */
        virtual bool         HasTreeView() = 0;
        /**
        * Tests if the system has properties widget associated with it
        * @return true if it has properties widget associated with it, otherwise false
        */
        virtual bool         HasPropertiesView() = 0;
        /**
        * Clears properties widget of properties listed and prepares the page with index ID to be displayed, but doesnt display it
        * @param ID ID of the sheet 
        * @see EDITORTYPE
        * @return true if any properties were removed, otherwise false
        */
        virtual bool         ClearPropertiesView(unsigned int ID) = 0;
        /**
        * Presents listed properties into treeview widget
        */
        virtual void         PresentPropertiesView() = 0;
        /**
        * Selects specified tree node item
        * @param handle a tree node item that can is obtained through 
        * @see OgitorsSystem::InsertTreeItem
        * @return
        */
        virtual void         SelectTreeItem(void *handle) = 0;
        /**
        * Inserts new tree node item into specified parent node
        * @param parent string value for parent node
        * @param name new tree node item name
        * @param iconid ID for new tree node item icon 
        * @param colour text color of new tree node item text
        * @return handle of new tree node item
        */
        virtual void *       InsertTreeItem(Ogre::String parent,Ogre::String name,int iconid, unsigned int colour) = 0;
        /**
        * Inserts new tree node item into specified parent node
        * @param parent parent node handle
        * @param name new tree node item name
        * @param iconid ID for new tree node item icon 
        * @param colour text color of new tree node item text
        * @return handle of new tree node item
        */
        virtual void *       InsertTreeItem(void *parent,Ogre::String name,int iconid, unsigned int colour) = 0;
        /**
        * Sets tree node item text
        * @param oldname current node item text
        * @param newname new node item text
        */
        virtual void         SetTreeItemText(Ogre::String oldname, Ogre::String newname) = 0;
        /**
        * Deletes tree node item with specified text
        * @param name name of node item to delete
        */
        virtual void         DeleteTreeItem(Ogre::String name) = 0;
        /**
        * Creates tree item root node
        * @param name name of the root node
        * @return handle of the root node
        */
        virtual void *       CreateTreeRoot(Ogre::String name) = 0;
        /**
        * Sets tree node' item text color
        * @param name name of tree node item
        * @param colour new colour of tree node item
        */
        virtual void         SetTreeItemColour(Ogre::String name, unsigned int colour) = 0;
        /**
        * Clears tree node(s)
        */
        virtual void         ClearTreeItems() = 0;
        /**
        * Clears the value of the property
        * @param caller currently selected object
        * @param idx ID of the property
        */
        virtual void	     ClearProperty(void *caller, int idx) = 0;
        /**
        * Enables property value to be changed
        * @param caller currently selected object
        * @param idx ID of the property
        * @param enable flag to enable or disable the property value
        */
        virtual void         EnableProperty(void *caller,int idx, bool enable) = 0;
        /**
        * Fetches string value of the property
        * @param caller currently selected object
        * @param idx ID of the property
        * @return string value of the property
        */
        virtual Ogre::String GetStringProperty(void *caller,int idx) = 0;
        /**
        * Fetches integer value of the property
        * @param caller currently selected object
        * @param idx ID of the property
        * @return integer value of the property
        */
        virtual int          GetIntProperty(void *caller,int idx) = 0;
        /**
        * Fetches floating point value of the property
        * @param caller currently selected object
        * @param idx ID of the property
        * @return floating point value of the property
        */
        virtual float        GetFloatProperty(void *caller,int idx) = 0;
        /**
        * Fetches boolean value of the property
        * @param caller currently selected object
        * @param idx ID of the property
        * @return boolean value of the property
        */
        virtual bool         GetBoolProperty(void *caller,int idx) = 0;
        /**
        * Fetches Ogre::ColourValue value of the property
        * @param caller currently selected object
        * @param idx ID of the property
        * @return Ogre::ColourValue value of the property
        */
        virtual Ogre::ColourValue GetColourProperty(void *caller,int idx) = 0;
        /**
        * Assigns a value for string-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::String value) = 0;
        /**
        * Assigns a value for integer-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,int value) = 0;
        /**
        * Assigns a value for float-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,float value) = 0;
        /**
        * Assigns a value for boolean-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,bool value) = 0;
        /**
        * Assigns a value for Ogre::Vector2-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Vector2 value) = 0;
        /**
        * Assigns a value for Ogre::Vector3-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Vector3 value) = 0;
        /**
        * Assigns a value for Ogre::Vector4-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Vector4 value) = 0;
        /**
        * Assigns a value for Ogre::Quaternion-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Quaternion value) = 0;
        /**
        * Assigns a value for Ogre::ColourValue-based property
        * @param caller currently selected object
        * @param idx ID of the property
        * @param value value for the property
        * @return true if property was assigned successfully, otherwise false
        */
        virtual bool         SetColourProperty(void *caller,int idx,Ogre::ColourValue value) = 0;
        /**
        * Fills property options from specified options list
        * @param caller currently selected object
        * @param idx ID of the property
        * @param optlist options list to fetch property options from
        */
        virtual void         FillPropertyOptions(void *caller,int idx, Ogre::StringVector &optlist) = 0;
        /**
        * Creates new group property (a property that has appears as a droplist)
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        */
        virtual void         CreateGroupProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew) = 0;
        /**
        * Creates new string-based property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property
        */
        virtual void         CreateStringProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::String& value) = 0;
        /**
        * Creates new enumeration-based group property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param list list of strings for enum-based droplist (i.e. eValue is converted into "eValue" for the list)
        */
        virtual void         CreateEnumProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::StringVector& list) = 0;
        /**
        * Creates new integer-based property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property
        */
        virtual void         CreateIntProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, int value) = 0;
        /**
        * Creates new float-based property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property
        */
        virtual void         CreateFloatProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, float value) = 0;
        /**
        * Creates new boolean-based property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property
        */
        virtual void         CreateBoolProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, bool value) = 0;
        /**
        * Creates new Ogre::ColourValue-based group property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property 
        * @see Ogre::ColourValue
        */
        virtual void         CreateColourProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::ColourValue& value) = 0;
        /**
        * Creates new Ogre::Quaternion-based group property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property 
        * @see Ogre::Quaternion
        */
        virtual void         CreateQuaternionProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Quaternion& value) = 0;
        /**
        * Creates new Ogre::Vector2-based group property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property 
        * @see Ogre::Vector2
        */
        virtual void         CreateVector2Property(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Vector2& value, const Ogre::String& fx = "X", const Ogre::String& fy = "Y") = 0;
        /**
        * Creates new Ogre::Vector3-based group property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property 
        * @see Ogre::Vector3
        */
        virtual void         CreateVector3Property(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Vector3& value, const Ogre::String& fx = "X", const Ogre::String& fy = "Y", const Ogre::String& fz = "Z") = 0;
        /**
        * Creates new Ogre::Vector4-based group property
        * @param caller currently selected object
        * @param idxparent ID of the parent property
        * @param idxnew ID of property
        * @param namenew name of the property
        * @param value value for property 
        * @see Ogre::Vector4
        */
        virtual void         CreateVector4Property(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Vector4& value, const Ogre::String& fx = "X", const Ogre::String& fy = "Y", const Ogre::String& fz = "Z", const Ogre::String& fw = "W") = 0;
        /**
        * Expands or contracts specified group property
        * @param caller currently selected object
        * @param idx ID of property
        * @param expand flag to expand/contract the group property
        */
        virtual void         ExpandProperty(void *caller,int idx, bool expand) = 0;
        /**
        * Sets mouse cursor icon
        * @param cursor cursor type 
        * @see OgitorsMouseCursorType
        */
        virtual void         SetMouseCursor(unsigned int cursor) {};
        /**
        * Sets mouse cursor position
        * @param new position of mouse cursor
        */
        virtual void         SetMousePosition(Ogre::Vector2 position) {};
        /**
        * Shows/hides mouse cursor
        * @param bShow flag to show/hide mouse cursor
        */
        virtual void         ShowMouseCursor(bool bShow) {};
        /**
        * Sets GUI control index
        * @param widget widget to set ID for
        * @param IDX new widget ID
        * @deprecated
        */
        virtual void         SetGUIControlIndex(OGUIWidget *widget, int IDX) {};
        /**
        * Sets GUI widget text
        * @param widget widget to set text for
        * @param text new widget text
        * @deprecated
        */
        virtual void         SetGUIControlText(OGUIWidget *widget, std::string text) {};
        /**
        * Fetches GUI widget ID
        * @param widget widget to get an ID of
        * @return ID of the widget
        * @deprecated
        */
        virtual int          GetGUIControlIndex(OGUIWidget *widget) {return -1;};
        /**
        * Fetches GUI widget text
        * @param widget widget to get the text of
        * @return text of the widget
        * @deprecated
        */
        virtual std::string  GetGUIControlText(OGUIWidget *widget) {return "";};
        /**
        * Sets GUI widget sub-items
        * @param widget parent widget to assign sub-items for
        * @return items list of sub-widget(s) text
        * @deprecated
        */
        virtual void         SetGUIControlItems(OGUIWidget *widget, std::vector<std::string> items) {};

    protected:
        BindingMap m_Bindings;                              /** Hash map that stores property ID/value pairs */
    };

    //! Dummy class
    /*!  
        Dummy class with empty implementations
        @deprecated
    */
    class OgitorsDummySystem: public OgitorsSystem
    {
    public:
        /**
        * @copydoc OgitorsSystem::OgitorsSystem()
        */
        OgitorsDummySystem() {};
        /**
        * @copydoc OgitorsSystem::~OgitorsSystem()
        */
        virtual ~OgitorsDummySystem() {};
        /**
        * @copydoc OgitorsSystem::CopyFilesEx(Ogre::String, Ogre::String)
        */
        virtual bool CopyFilesEx(Ogre::String source, Ogre::String destination) {return false;};
        /**
        * @copydoc OgitorsSystem::MakeDirectory(Ogre::String)
        */
        virtual bool MakeDirectory(Ogre::String dirname) {return false;};
        /**
        * @copydoc OgitorsSystem::GetExePath()
        */
        virtual Ogre::String GetExePath() {return "./";};
        /**
        * @copydoc OgitorsSystem::getProjectsDirectory()
        */
        virtual Ogre::String getProjectsDirectory() {return "./";};
        /**
        * @copydoc OgitorsSystem::DeleteFile(const Ogre::String&)
        */
        virtual void DeleteFile(const Ogre::String &file) {};
        /**
        * @copydoc OgitorsSystem::RenameFile(const Ogre::String&, const Ogre::String&)
        */
        virtual void RenameFile(const Ogre::String &oldname, const Ogre::String &newname) {};
        /**
        * @copydoc OgitorsSystem::GetFileList(Ogre::String, Ogre::StringVector&)
        */
        virtual void GetFileList(Ogre::String path, Ogre::StringVector &list) {list.clear();};
        /**
        * @copydoc OgitorsSystem::DisplayOpenDialog(Ogre::UTFString, Ogre::UTFStringVector&)
        */
        virtual Ogre::String DisplayOpenDialog(Ogre::UTFString title, UTFStringVector ExtensionList) {return "";};
        /**
        * @copydoc OgitorsSystem::DisplaySaveDialog(Ogre::UTFString, Ogre::UTFStringVector&)
        */
        virtual Ogre::String DisplaySaveDialog(Ogre::UTFString title, UTFStringVector ExtensionList) {return "";};
        /**
        * @copydoc OgitorsSystem::DisplayMessageDialog(Ogre::UTFString, DIALOGTYPE)
        */
        virtual DIALOGRET    DisplayMessageDialog(Ogre::UTFString msg, DIALOGTYPE dlgType) {return DLGRET_CANCEL;};
        /**
        * @copydoc OgitorsSystem::DisplayTerrainDialog(Ogre::NameValuePairList&)
        */
        virtual bool         DisplayTerrainDialog(Ogre::NameValuePairList &params) {return false;};
        /**
        * @copydoc OgitorsSystem::DisplayImportHeightMapDialog(Ogre::NameValuePairList)
        */
        virtual bool         DisplayImportHeightMapDialog(Ogre::NameValuePairList &params) {return false;};
        /**
        * @copydoc OgitorsSystem::UpdateLoadProgress(float percentage, Ogre::UTFString msg)
        */
        virtual void         UpdateLoadProgress(float percentage, Ogre::UTFString msg) {};
        /**
        * @copydoc OgitorsSystem::UnLoadPropertySheets()
        */
        virtual void         UnLoadPropertySheets() {};
        /**
        * @copydoc OgitorsSystem::LoadPropertySheet(int, Ogre::String)
        */
        virtual void         LoadPropertySheet(int idx, Ogre::String filename) {};
        /**
        * @copydoc OgitorsSystem::HasTreeView()
        */
        virtual bool         HasTreeView() {return false;};
        /**
        * @copydoc OgitorsSystem::HasPropertiesView()
        */
        virtual bool         HasPropertiesView() {return false;};
        /**
        * @copydoc OgitorsSystem::ClearPropertiesView(unsigned int)
        */
        virtual bool         ClearPropertiesView(unsigned int ID) {return false;};
        /**
        * @copydoc OgitorsSystem::PresentPropertiesView()
        */
        virtual void         PresentPropertiesView() {};
        /**
        * @copydoc OgitorsSystem::SelectTreeItem(void *)
        */
        virtual void         SelectTreeItem(void *handle) {};
        /**
        * @copydoc OgitorsSystem::InsertTreeItem(Ogre::String, Ogre::String, int, unsigned int)
        */
        virtual void *       InsertTreeItem(Ogre::String parent,Ogre::String name,int iconid, unsigned int colour) {return 0;};
        /**
        * @copydoc OgitorsSystem::InsertTreeItem(void *, Ogre::String, int, unsigned int)
        */
        virtual void *       InsertTreeItem(void *parent,Ogre::String name,int iconid, unsigned int colour) {return 0;};
        /**
        * @copydoc OgitorsSystem::CreateTreeRoot(Ogre::String)
        */
        virtual void *       CreateTreeRoot(Ogre::String name) {return 0;};
        /**
        * @copydoc OgitorsSystem::SetTreeItemText(Ogre::String, Ogre::String)
        */
        virtual void         SetTreeItemText(Ogre::String oldname, Ogre::String newname) {};
        /**
        * @copydoc OgitorsSystem::SetTreeItemColour(Ogre::String, unsigned int)
        */
        virtual void         SetTreeItemColour(Ogre::String name, unsigned int colour ) {};
        /**
        * @copydoc OgitorsSystem::DeleteTreeItem(Ogre::String)
        */
        virtual void         DeleteTreeItem(Ogre::String name) {};
        /**
        * @copydoc OgitorsSystem::ClearTreeItems()
        */
        virtual void         ClearTreeItems() {};
        /**
        * @copydoc OgitorsSystem::ClearProperty(void *, int)
        */
        virtual void	     ClearProperty(void *caller, int idx) {};
        /**
        * @copydoc OgitorsSystem::EnableProperty(void *, int, bool)
        */
        virtual void         EnableProperty(void *caller, int idx, bool enable) {};
        /**
        * @copydoc OgitorsSystem::GetStringProperty(void *, int)
        */
        virtual Ogre::String GetStringProperty(void *caller, int idx) {return "";};
        /**
        * @copydoc OgitorsSystem::GetIntProperty(void *, int)
        */
        virtual int          GetIntProperty(void *caller, int idx) {return 0;};
        /**
        * @copydoc OgitorsSystem::GetFloatProperty(void *, int)
        */
        virtual float        GetFloatProperty(void *caller, int idx) {return 0.0f;};
        /**
        * @copydoc OgitorsSystem::GetBoolProperty(void *, int)
        */
        virtual bool         GetBoolProperty(void *caller, int idx) {return false;};
        /**
        * @copydoc OgitorsSystem::GetColourProperty(void *, int)
        */
        virtual Ogre::ColourValue GetColourProperty(void *caller, int idx) {return Ogre::ColourValue(0,0,0);};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, Ogre::String)
        */
        virtual bool         SetProperty(void *caller, int idx,Ogre::String value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, int)
        */
        virtual bool         SetProperty(void *caller, int idx,int value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, float)
        */
        virtual bool         SetProperty(void *caller, int idx,float value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, bool)
        */
        virtual bool         SetProperty(void *caller, int idx,bool value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, Ogre::Vector2)
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Vector2 value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, Ogre::Vector3)
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Vector3 value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, Ogre::Vector4)
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Vector4 value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, Ogre::Quaternion)
        */
        virtual bool         SetProperty(void *caller,int idx,Ogre::Quaternion value) {return false;};
        /**
        * @copydoc OgitorsSystem::SetProperty(void *, int, Ogre::ColourValue)
        */
        virtual bool         SetColourProperty(void *caller, int idx,Ogre::ColourValue value) {return false;};
        /**
        * @copydoc OgitorsSystem::FillPropertyOptions(void *, int, Ogre::StringVector&)
        */
        virtual void         FillPropertyOptions(void *caller, int idx, Ogre::StringVector &optlist) {};
        /**
        * @copydoc OgitorsSystem::CreateGroupProperty(void *, int, int, const Ogre::String&)
        */
        virtual void         CreateGroupProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew) {};
        /**
        * @copydoc OgitorsSystem::CreateStringProperty(void *, int, int, const Ogre::String&, const Ogre::String&)
        */
        virtual void         CreateStringProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::String& value) {};
        /**
        * @copydoc OgitorsSystem::CreateEnumProperty(void *, int, int, const Ogre::String&, const Ogre::StringVector&)
        */
        virtual void         CreateEnumProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::StringVector& list) {};
        /**
        * @copydoc OgitorsSystem::CreateIntProperty(void *, int, int, const Ogre::String&, int)
        */
        virtual void         CreateIntProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, int value) {};
        /**
        * @copydoc OgitorsSystem::CreateFloatProperty(void *, int, int, const Ogre::String&, float)
        */
        virtual void         CreateFloatProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, float value) {};
        /**
        * @copydoc OgitorsSystem::CreateBoolProperty(void *, int, int, const Ogre::String&, bool)
        */
        virtual void         CreateBoolProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, bool value) {};
        /**
        * @copydoc OgitorsSystem::CreateColourProperty(void *, int, int, const Ogre::String&, const Ogre::ColourValue&)
        */
        virtual void         CreateColourProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::ColourValue& value) {};
        /**
        * @copydoc OgitorsSystem::CreateQuaternionProperty(void *, int, int, const Ogre::String&, const Ogre::Quaternion&)
        */
        virtual void         CreateQuaternionProperty(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Quaternion& value) {};
        /**
        * @copydoc OgitorsSystem::CreateVector2Property(void *, int, int, const Ogre::String&, const Ogre::Vector2&)
        */
        virtual void         CreateVector2Property(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Vector2& value, const Ogre::String& fx = "X", const Ogre::String& fy = "Y") {};
        /**
        * @copydoc OgitorsSystem::CreateVector3Property(void *, int, int, const Ogre::String&, const Ogre::Vector3&)
        */
        virtual void         CreateVector3Property(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Vector3& value, const Ogre::String& fx = "X", const Ogre::String& fy = "Y", const Ogre::String& fz = "Z") {};
        /**
        * @copydoc OgitorsSystem::CreateVector4Property(void *, int, int, const Ogre::String&, const Ogre::Vector4&)
        */
        virtual void         CreateVector4Property(void *caller,int idxparent, int idxnew, const Ogre::String& namenew, const Ogre::Vector4& value, const Ogre::String& fx = "X", const Ogre::String& fy = "Y", const Ogre::String& fz = "Z", const Ogre::String& fw = "W") {};
        /**
        * @copydoc OgitorsSystem::ExpandProperty(void *, int, bool)
        */
        virtual void         ExpandProperty(void *caller, int idx, bool expand) {};
    };
}
